package com.genreate.util.draw;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.RandomUtil;

import java.util.List;

/**
 * 抽奖工具类
 */
public class LotteryUtil {
    /**
     * 抽奖方法
     *
     * @param prizes 奖品列表
     * @param <T>    奖品类型
     * @return 中奖的奖品，如果未中奖返回null
     */
    public static <T extends LotteryAble> T draw(List<T> prizes) {
        if (CollectionUtil.isEmpty(prizes)) {
            return null;
        }

        // 计算总概率
        double totalProbability = prizes.stream().mapToDouble(LotteryAble::getProbability).sum();

        // 生成一个0到总概率之间的随机数
        double random = RandomUtil.randomDouble(Double.MIN_VALUE, totalProbability);

        // 遍历奖品，确定中奖项
        double currentRange = 0;
        for (T prize : prizes) {
            currentRange += prize.getProbability();
            if (random <= currentRange) {
                return prize;
            }
        }

        // 如果没有中奖（理论上不会走到这里，除非概率设置有问题）
        return null;
    }
}